/*
 * @Description:中间件是指客户端请求先走中间件进行处理的数据可以共享
 * @Author: 小雨
 * @Date: 2024-06-27 17:03:04
 * @LastEditTime: 2024-06-28 11:28:56
 * @LastEditors: 小雨
 */
const express = require('express');
const parser = require('body-parser');
const bodyParser = require('./custom-body-parser');
const app = express();
const mw = function (req, res, next) {
    //统一挂载属性不需要一个一个去设置req、res
    const time = new Date();
    req.startTime = time; //这样所有的req就会有startTime这个属性
    //把流转关系，转交给下一个中间件或者路由
    console.log('调用了第一个全局中间件');
    next();
};

app.use(bodyParser); //使用拆分的custom-body-parser.js
//拆分出去一个自定义模块custom-body-parser.js
// app.use((req, res, next) => {
//     //定义一个字符串 存储客户端发来的请求体数据
//     let str = '';
//     //监听req.data事件
//     req.on('data', (chunk) => {
//         str += chunk;
//     });
//     //监听req.end事件，请求结束
//     req.on('end', () => {
//         //请求结束str就是完成的请求体数据
//         //把字符串解析为对象格式
//         let body = qs.parse(str);
//         req.body = body;
//     });
//     next();
// });

//全局中间件需要在路由之前
app.use(mw);
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(parser.urlencoded({ extended: false })); //解析表单数据和上面一样

app.post('/user', (req, res) => {
    //接受body
    res.send(req.body);
});

//在服务器中可以通过req.body这个属性，来接受客户端发来的请求体数据  客户端post请求body数据为json格式
app.post('/body', (req, res) => {
    //默认情况下没有配置解析json表单数据的中间件，默认值为undefined 需要使用express.json中间件
    console.log(req.body);
    res.send(`${JSON.stringify(req.body)} + 'req.body的json数据'`);
});

//在服务器中可以通过req.body这个属性，来接受客户端发来的请求体数据  客户端post请求body数据为x-www-form-urlencoded格式
app.post('/body', (req, res) => {
    //默认情况下没有配置解析urlencoded表单数据的中间件，默认值为{}需要使用express.urlencoded中间件
    console.log(req.body);
    res.send(`${JSON.stringify(req.body)} + 'req.body的json数据'`);
});

app.post('/type', (req, res) => {
    console.log(req.body);
    res.send('ok');
});

//放在上面 局部中间件需要在使用路由之前
const mw1 = function (req, res, next) {
    console.log('局部生效中间件');
    next();
};

//局部中间件需要在使用路由之前
app.post('/name', mw1, (req, res) => {
    console.log('name');
    res.send('调用了局部中间件mw1');
});

app.listen(80, () => {
    console.log('服务启动');
});
